/* 传入一个参数 options,options是一个对象 */
function Ajax(options) {
    //传入给服务器的URL必填
    if (!options.url) {
        throw new Error("请求URL不能为空!");
    }
    //定义一个默认参数,作用是不写的使用,可以使用的默认值
    let dp = {
        type: "GET",//请求方式有默认值
        data: "",//请求参数
        async: true,//是否异步,默认值true
        success: function () { },//函数
        dataType: 'string'//期望服务器返回给我们的数据
    }
    //将传入的数据交给的默认值,你传了,就使用你传入的内容,如果你没有传入,使用默认值
    for (let key in options) {
        dp[key] = options[key]
    }
    //校验用户传入数据格式
    if (!(dp.type.toUpperCase() == "GET" || dp.type.toUpperCase() == "POST")) {
        throw new Error("请求的方式为GET或者POST请求")
    }
    //校验是否异步
    if (typeof dp.async != 'boolean') {
        throw new Error("是否异步为true或者false")
    }
    // [object Function]
    if (Object.prototype.toString.call(dp.success) != '[object Function]') {
        throw new Error("使用函数接收服务端传送过来的数据")
    }
    //校验期望返回的数据类型
    if (!(dp.dataType == 'string' || dp.dataType == 'json')) {
        throw new Error("期望返回的数据类型是字符串或者JSON")
    }
    //校验客户的传参    "username=wenyuan&password=123456&age=18"
    // (username=wenyuan&password=123456)  
    if (!(typeof dp.data == 'string' && /^(\w+=\w+&?)*$/.test(dp.data) || Object.prototype.toString.call(dp.data) == '[object Object]')) {
        throw new Error("校验参数错误")
    }
    if (Object.prototype.toString.call(dp.data) == '[object Object]') {
        let str = ""
        for (let key in dp.data) {
            str += `${key}=${dp.data[key]}&`
        }
        str = str.slice(0, -1);
        dp.data = str;
    }
    /* 
        发送ajax请求
    */
    let xhr;
    if (!new XMLHttpRequest()) {
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    } else {
        xhr = new XMLHttpRequest();
    }
    if (dp.type.toUpperCase() == 'GET') {
        xhr.open(dp.type, `${dp.url}?${dp.data}`, dp.async);
        xhr.send();
    } else {
        xhr.open(dp.type, dp.url, dp.async);
        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
        xhr.send(dp.data);
    }
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
            if (dp.dataType == 'string') {
                dp.success(xhr.responseText)
            } else {
                dp.success(JSON.parse(xhr.responseText))
            }
        }
    }
}